package com.demo.java.OD101_150.OD146;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【整数对最小和】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/145739867
 */
public class OdMain {
    public static void main(String[] args) {

        // 创建扫描器对象用于从控制台读取输入
        Scanner scanner = new Scanner(System.in);

        // 读取整数 N，表示第一个列表 v1 的大小
        int N = scanner.nextInt();
        // 创建一个列表 v1，用于存储第一个输入的整数列表
        List<Integer> v1 = new ArrayList<>();
        for (int i = 0; i < N; i++) {
            // 读取每个整数并添加到 v1 列表中
            int j = scanner.nextInt();
            v1.add(j);
        }

        // 读取整数 M，表示第二个列表 v2 的大小
        int M = scanner.nextInt();
        // 创建一个列表 v2，用于存储第二个输入的整数列表
        List<Integer> v2 = new ArrayList<>();
        for (int i = 0; i < M; i++) {
            // 读取每个整数并添加到 v2 列表中
            int j = scanner.nextInt();
            v2.add(j);
        }

        // 读取目标值 target，表示需要找到最小的 target 个和
        int target = scanner.nextInt();

        // 创建一个列表 res，用于存储 v1 和 v2 列表中所有元素的和
        List<Integer> res = new ArrayList<>();
        // 使用两个嵌套的循环来计算 v1 和 v2 中所有元素的和
        for (int x : v1) {
            for (int y : v2) {
                // 将每一对 x 和 y 的和添加到 res 列表中
                res.add(x + y);
            }
        }

        // 对 res 列表中的和进行升序排序
        Collections.sort(res);

        // 初始化变量 result 用于存储最小的 target 个和的总和
        int result = 0;
        // 从排序后的 res 列表中取出最小的 target 个和
        for (int i = 0; i < target; i++) {
            // 累加最小的 target 个和
            result += res.get(i);
        }

        // 输出结果，即最小的 target 个和的总和
        System.out.println(result);
    }
}
